home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / unix-lpr.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  1995-08-26  |  4KB  |  161 lines

  1. #!/bin/sh
  2. #
  3. # Unix lpr filter. The default setup sends output directly to a pipe,
  4. # which requires the Ghostscript process to fork, and thus may cause 
  5. # small systems to run out of memory/swap space. An alternative strategy,
  6. # based on a suggestion by Andy Fyfe (andy@cs.caltech.edu), uses a named
  7. # pipe for output, which avoids the fork and can thus save a lot of memory.
  8. #
  9. # Unfortunately this approach can cause problems when a print job is aborted, 
  10. # as the abort can cause one of the processes to die, leaving the process 
  11. # at the other end of the pipe hanging forever.
  12. #
  13. # Because of this, the named pipe method has not been made the default,
  14. # but it may be restored by commenting out the lines referring to
  15. # 'gsoutput' and uncommenting the lines referring to 'gspipe'.
  16. #
  17.  
  18. PBMPLUSPATH=/usr/local/bin
  19. PSFILTERPATH=/usr/local/lib/ghostscript
  20. LOCALPATH=/usr/local/bin
  21. X11HOME=/usr/X11R6
  22.  
  23. PATH=/bin:/usr/bin:/usr/ucb:/usr/etc
  24. PATH=${PATH}\:${LOCALPATH}\:${PBMPLUSPATH}\:${PSFILTERPATH}
  25. LD_LIBRARY_PATH=${X11HOME}/lib
  26.  
  27. export PATH LD_LIBRARY_PATH acctfile host user
  28.  
  29. user= host= acctfile=/dev/null
  30.  
  31. #
  32. # Redirect stdout to stderr (for the logfile) and open a new channel
  33. # connected to stdout for the raw data. This enables us to keep the
  34. # raw data separate from programmed postscript output and error messages.
  35. #
  36. exec 3>&1 1>&2
  37.  
  38. #
  39. # Get username and hostname from filter parameters
  40. #
  41. while [ $# != 0 ]
  42. do  case "$1" in
  43.   -n)    user=$2 ; shift ;;
  44.   -h)    host=$2 ; shift ;;
  45.   -*)    ;;
  46.   *)    acctfile=$1 ;;
  47.   esac
  48.   shift
  49. done
  50.  
  51. #
  52. # Get the filter, printer device and queue type (direct/indirect)
  53. #
  54. filter=`basename $0`
  55. device=`dirname $0`
  56. type=`dirname ${device}`
  57. device=`basename ${device}`
  58. fdevname=$device
  59. type=`basename ${type}`
  60.  
  61. #
  62. # Find the bpp and number of colors, if specified
  63. #
  64.  
  65. colorspec="`echo ${device} | sed 's/.*\.[0-9][0-9]*\.\([0-9][0-9]*\)$/\1/'`"
  66. if test "$colorspec" = "${device}"
  67. then
  68.     colorspec=""
  69. else
  70.     device=`basename ${device} .$colorspec`
  71.     colorspec="-dColors=$colorspec"
  72. fi
  73.  
  74. bpp="`echo ${device} | sed 's/.*\.\([0-9][0-9]*\)$/\1/'`"
  75. if test "$bppspec" = "${device}"
  76. then
  77.     bpp=1
  78. else
  79.     device=`basename ${device} .$bpp`
  80. fi
  81.  
  82. #
  83. # Information for the logfile
  84. #
  85. lock=`dirname ${acctfile}`/lock
  86. cf=`tail -1 ${lock}`
  87. job=`egrep '^J' ${cf} | tail +2c`
  88.  
  89. echo "gsbanner: ${host}:${user}  Job: ${job}  Date: `date`"
  90. echo "gsif: ${host}:${user} ${fdevname} start - `date`"
  91.  
  92. #
  93. # Set the direct or indirect output destinations
  94. #
  95. #gspipe=/tmp/gspipe.$$
  96. #mknod ${gspipe} p
  97.  
  98. case "${type}" in
  99.   direct)
  100.         gsoutput="cat 1>&3" ;;
  101. #        cat ${gspipe} 1>&3 & ;;
  102.   indirect)
  103.         gsoutput="lpr -P${device}.raw" ;;
  104. #        cat ${gspipe} | lpr -P${device}.raw & ;;
  105. esac
  106.  
  107. (
  108. #
  109. # Any setup required may be done here (eg. setting gamma for colour printing)
  110. #
  111. #echo "{0.333 exp} dup dup currenttransfer setcolortransfer"
  112.  
  113. #
  114. # The input data is filtered here, before being passed on to Ghostscript
  115. #
  116. case "${filter}" in
  117.   gsif)      cat ;;
  118.   gsnf)      psdit ;;
  119.   gstf)      pscat ;;
  120.   gsgf)      psplot ;;
  121.   gsvf)      rasttopnm | pnmtops ;;
  122.   gsdf)      dvi2ps -sqlw ;;
  123.   gscf|gsrf) echo "${filter}: filter not available" 1>&2 ; exit 0 ;;
  124. esac
  125.  
  126. #
  127. # This is the postlude which does the accounting
  128. #
  129. echo "\
  130. (acctfile) getenv
  131.   { currentdevice /PageCount gsgetdeviceprop dup cvi 0 gt
  132.     { exch (a) file /acctfile exch def
  133.       /string 20 string def
  134.       string cvs dup length dup
  135.       4 lt
  136.         { 4 exch sub
  137.           { acctfile ( ) writestring } repeat
  138.         } { pop } ifelse
  139.       acctfile exch writestring
  140.       acctfile (.00 ) writestring
  141.       acctfile (host) getenv 
  142.         { string cvs } { (NOHOST) } ifelse writestring
  143.       acctfile (:) writestring
  144.       acctfile (user) getenv
  145.         { string cvs } { (NOUSER) } ifelse writestring
  146.       acctfile (\n) writestring
  147.       acctfile closefile
  148.     } { pop } ifelse
  149.   } if
  150. quit"
  151. ) | gs -q -dNOPAUSE -sDEVICE=${device} -dBitsPerPixel=${bpp} $colorspec \
  152.         -sOutputFile=\|"${gsoutput}" -
  153. #        -sOutputFile=${gspipe} -
  154.  
  155. rm -f ${gspipe}
  156. #
  157. # End the logfile entry
  158. #
  159. echo "gsif: end - `date`"
  160.  
  161.